<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

include_once 'ExceptionDAO.php';
include_once 'DAOControleAcesso.php';

/**
 * Representacao o controle de acesso do sistema.
 * @author Douglas Rafael
 * @package models
 */
class ControleAcesso extends CI_Model {
    // constante usadas para habilitar o log de a��es

    const LOG_ENABLED = TRUE;

    //PERMISS�ES OCULTAS
    const LOGIN = 1;
    const LOGOUT = 2;

    //constantes com as variáveis para guardar na sessão
    const USU_ID = "usu_id";
    const USU_SHORTNAME = "usu_shortname";

    //SUPERADMIN
    //VISUALIZAÇÔES
    const CONSULTAR_AUTOR = 10;
    const CONSULTAR_EDITORA = 11;
    const CONSULTAR_CATEGORIA = 12;
    const CONSULTAR_USUARIO = 13;
    const CONSULTAR_LIVRO = 14;
    const CONSULTAR_MAGAZINE = 15;
    const CONSULTAR_MIDIA = 16;

    //CADASTROS
    const CADASTRAR_AUTOR = 20;
    const CADASTRAR_EDITORA = 21;
    const CADASTRAR_CATEGORIA = 22;
    const CADASTRAR_USUARIO = 23;
    const CADASTRAR_LIVRO = 24;
    const CADASTRAR_MAGAZINE = 25;
    const CADASTRAR_MIDIA = 26;

    //ATUALIZAÇÕES
    const ATUALIZAR_AUTOR = 30;
    const ATUALIZAR_EDITORA = 31;
    const ATUALIZAR_CATEGORIA = 32;
    const ATUALIZAR_USUARIO = 33;
    const ATUALIZAR_LIVRO = 34;
    const ATUALIZAR_MAGAZINE = 35;
    const ATUALIZAR_MIDIA = 36;

    //EXCLUSOES
    const EXCLUIR_AUTOR = 40;
    const EXCLUIR_EDITORA = 41;
    const EXCLUIR_CATEGORIA = 42;
    const EXCLUIR_USUARIO = 43;
    const EXCLUIR_LIVRO = 44;
    const EXCLUIR_MAGAZINE = 45;
    const EXCLUIR_MIDIA = 46;

    /**
     * Verifica se um usuário tem permiss�o para executar uma a��o.
     * @param int $acao O id da a��o.
     * @return bool True se tem permiss�o ou False se n�o tem.
     */
    public function temPermissao($acao) {
        $dao = new DAOControleAcesso();
        return $dao->temPermissao($this->getIdUsuario(), $acao);
    }

    /**
     * Verifica se um usu�rio est� autenticado no sistema.
     * A propriedade USU_URL verifica em que sistema este usu�rio autenticou-se
     * pegando a URL base (ver em config.php) do mesmo. Isso evita que uma sess�o
     * de um sistema sirva para outros sistemas semelhantes
     *
     * @return True se o usu�rio tem dados na sess�o e se estes correspondem ao
     * sistema em quest�o
     */
    public function estaLogado() {
        return (array_key_exists(self::USU_ID, $_SESSION) && array_key_exists(self::USU_SHORTNAME, $_SESSION));
    }

    /**
     * Realiza a autentica��o do usu�rio no sistema.
     * A propriedade USU_URL verifica em que sistema este usu�rio autenticou-se
     * pegando a URL base (ver em config.php) do mesmo. Isso evita que uma sess�o
     * de um sistema sirva para outros sistemas semelhantes
     *
     * @return True se o usu�rio tem dados na sess�o e se estes correspondem ao
     * sistema em quest�o
     */
    public function autenticaUsuario() {
        $login = $this->input->post('usuario', TRUE);
        $senha = $this->input->post('senha', TRUE);

        $dao = new DAOControleAcesso();
        $usuario = $dao->autenticarUsuario($login, $senha);

        $_SESSION[self::USU_ID] = $usuario->codigo;
        $_SESSION[self::USU_SHORTNAME] = $usuario->nome;
    }

    /**
     *
     * @return unknown_type
     */
    public function deslogaUsuario() {
        session_unset();
        session_regenerate_id(TRUE);
    }

    /**
     * Consulta o usu�rio atualmente logado no sistema.
     *
     * @return TOUsuario
     */
    public function consultaUsuarioLogado() {
        $dao = new DAOControleAcesso();
        return $dao->consultaUsuario($_SESSION[self::USU_ID]);
    }

    /**
     * Consulta um usu�rio.
     * @param int $id
     * @return TOUsuarioServidor
     */
    public function consultaUsuario($id) {
        $dao = new DAOControleAcesso();
        return $dao->consultaUsuario($id);
    }

    /**
     * Obt�m o Id do usu�rio
     * logado. Obt�m esse valor da sess�o.
     * @return int O id do usu�rio.
     */
    public function getIdUsuario() {
        return (isset($_SESSION[self::USU_ID])) ? $_SESSION[self::USU_ID] : null;
    }

}